home *** CD-ROM | disk | FTP | other *** search
Java Source | 2000-06-23 | 6.9 KB | 201 lines |
- import java.awt.event.ActionEvent;
- import java.awt.event.ActionListener;
- import java.awt.AWTEventMulticaster;
-
- import com.apple.mrj.jdirect.PointerStruct;
-
- /**
- * Apple Worldwide Developer Technical Support
- *
- * Sample showing how to send and receive AppleEvents using JDirect 2.
- *
- * File: AERecive.java
- *
- * This class contains the code needed to register an AppleEvent handler
- * to recive and reply to AppleEvents.
- * The received AppleEvent's text data is fired as an java.awt.event.ActionEvent
- * to all registered ActionListeners.
- *
- * @author Levi Brown
- * @author Michael Hopkins
- * @author Apple Computer, Inc.
- *
- * Copyright ©1999 Apple Computer, Inc.
- * All rights reserved.
- *
- * @version 1.0
- * 4/15/1999 Shipped as 'AppleEvent Send and Receive' sample.
- *
- * You may incorporate this sample code into your applications without
- * restriction, though the sample code has been provided "AS IS" and the
- * responsibility for its operation is 100% yours. However, what you are
- * not permitted to do is to redistribute the source as "Apple Sample
- * Code" after having made changes. If you're going to re-distribute the
- * source, we require that you make it clear in the source that the code
- * was descended from Apple Sample Code, but that you've made changes.
- */
- public class AEReceive implements TypesConstants, AppleEventConstants, AEDataModelConstants
- {
- /**
- * The maximum length of the keyDirectObject parameter of the Apple Event
- */
- protected static final int kMaxTextSize = 255;
- /**
- * The OSType (four character code) of the event class.
- * 'Test' in this case.
- */
- protected static final int kTestClass = 0x54657374; //'Test'
- /**
- * The OSType (four character code) of the event ID.
- * 'TsID' in this case.
- */
- protected static final int kTestID = 0x54734944; //'TsID'
- /**
- * The Universal Proceedure Pointer for the Apple Event handler.
- * We keep a reference to this object to prevent the garbage collector
- * from disposing it, to prevent potential Mixed Mode Manager execution failures.
- * @see #AEInstallHandlers
- */
- protected AEEventHandlerClosureUPP myAEHandlerUPP;
- /**
- * The list of all registered ActionEvent listeners for this object.
- * @see #addActionListener
- * @see #removeActionListener
- * @see #fireActionEvent
- */
- protected ActionListener actionListener = null;
-
- /**
- * Creates a new AERecive object and initializes defaults.
- */
- public AEReceive()
- {
- }
-
- /**
- * Installs our AppleEvent handler for our supported high-level event.
- * @exception if any problem occured while registering the AppleEvent handler.
- */
- public void installAEHandler() throws NativeException
- {
- short err;
-
- //Create our Universal Proceedure Pointer to reference our callback method.
- myAEHandlerUPP = new AEEventHandlerClosureUPP(new MyAEHandler());
-
- //Install our Apple Event handler.
- err = AppleEventFunctions.AEInstallEventHandler( kTestClass, kTestID, myAEHandlerUPP, 0, false );
- ErrorHandler.checkError(err, "AEInstallHandlers: Error returned from AEGetParamPtr");
- }
-
- /**
- * A wrapper class to implement the AEEventHandlerInterface for our callback routine.
- */
- public class MyAEHandler implements AEEventHandlerInterface
- {
- /**
- * The method <CODE>AEEventHandler</CODE> will be invoked via a <CODE>AEEventHandlerClosureUPP</CODE> thunk.<BR>
- * No conversion is done to wrap java objects around the raw native parameters.<BR>
- * You may need to do the conversion yourself.
- *
- * @param theAppleEvent in C: <CODE>const AppleEvent *theAppleEvent</CODE>
- * @param reply in C: <CODE>AppleEvent *reply</CODE>
- * @param handlerRefcon in C: <CODE>UInt32 handlerRefcon</CODE>
- * @return in C: <CODE>OSErr </CODE>
- */
- public short AEEventHandler(int theAppleEvent, int reply, int handlerRefcon)
- {
- int[] actualType = new int[1];
- int[] actualSize = new int[1];
- byte[] theText = new byte[kMaxTextSize];
- short err;
-
- try
- {
- //Here we are creating a anonymous class which implements the abstracted getSize menthod of the PointerStruct class,
- //in order to create a PointerStruct to fill with the AppleEvent.
- PointerStruct eventPtr = new PointerStruct(theAppleEvent)
- {
- public int getSize()
- {
- return AppleEventStruct.sizeOfAppleEvent;
- }
- };
-
- //Create a new AppleEventStruct using the constructor to copy data received by our handler.
- AppleEventStruct aeStruct = new AppleEventStruct(eventPtr, 0);
-
- //We are using AEGetParamPointer to retrieve our data (text) from the Apple Event, which gets stored in 'theText'.
- err = AEDataModelFunctions.AEGetParamPtr(aeStruct, keyDirectObject, typeChar, actualType, theText, kMaxTextSize, actualSize);
- ErrorHandler.checkError(err, "AEEventHandler: Error returned from AEGetParamPtr");
-
- //Create a String from the byte array of returned data.
- String text = new String(theText, 0, actualSize[0]);
-
- //Fire an ActionEvent with the data so registered ActionListeners can see the AppleEvent being received.
- fireActionEvent(text);
-
- //Here we are creating another anonymous class which implements the abstracted getSize menthod of the PointerStruct class.
- //In this case it is for the reply.
- PointerStruct replyPtr = new PointerStruct(reply)
- {
- public int getSize()
- {
- return AppleEventStruct.sizeOfAppleEvent;
- }
- };
-
- //Create a new AppleEventStruct using the constructor to copy the reply.
- AppleEventStruct aeReplyStruct = new AppleEventStruct(replyPtr, 0);
-
- //Make a reply
- String replyText = "Thank you sir, may I have another?!";
-
- //Turn the reply String into a byte array
- byte[] theData = replyText.getBytes();
-
- //Put the string into the direct object parameter
- err = AEDataModelFunctions.AEPutParamPtr(aeReplyStruct, keyDirectObject, typeChar, theData, theData.length);
- ErrorHandler.checkError(err, "AEEventHandler: Error returned from AEPutParamPtr");
- }
- catch (NativeException exc)
- {
- System.err.println(exc.getMessage());
- return (exc.getErrNum());
- }
-
- return noErr;
- }
- }
-
- /**
- * Adds the specified action listener to receive action events from this object.
- * @param l the action listener
- */
- public void addActionListener(ActionListener l)
- {
- actionListener = AWTEventMulticaster.add(actionListener, l);
- }
-
- /**
- * Removes the specified action listener so it no longer receives
- * action events from this object.
- * @param l the action listener
- */
- public void removeActionListener(ActionListener l)
- {
- actionListener = AWTEventMulticaster.remove(actionListener, l);
- }
-
- /**
- * Fire an action event to the listeners.
- * @param the action command associated with the event.
- * In this case it will be the text from the AppleEvent.
- */
- protected void fireActionEvent(String message)
- {
- if (actionListener != null)
- actionListener.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, message));
- }
- }
-